{"componentChunkName":"component---src-templates-blog-post-js","path":"/Hoisting /","result":{"data":{"site":{"siteMetadata":{"title":"EID Blog"}},"markdownRemark":{"id":"75bcec5d-b54b-58bc-a887-2d6e8836097d","excerpt":"Small Example Compiled or interpreted? This article isn’t about how JS engines work.\nTo understand how hoisting works, let me tell you about the work of the JS…","html":"<h2>Small Example</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nx <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> x<span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<details>\n  <summary>Show output</summary>\n   undefined <br/>\n   5\n</details>\n<h2>Compiled or interpreted?</h2>\n<p>This article isn’t about how JS engines work.\nTo understand how hoisting works, let me tell you about the work of the JS engine\nin a simplified way. First, the code is compiled. The compiler finds and binds all\ndeclarations to the corresponding scopes. After that the code is executed</p>\n<h2>What changes after compilation?</h2>\n<p>The JS compiler creates variable declarations to the top of their scope for optimization.\nJS perceives <code class=\"language-text\">var x = 5;</code> as two commands. First - declare x, second - assign x the value 5.\nSo, all variables are declared before any value is assigned to them.\nLet’s go back to the example. Try to rewrite the code from the example as it\nwill look after compilation.</p>\n<details>\n<summary>Show answer</summary>\n<p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> x<span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// undefined</span>\nx <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 5</span></code></pre></div>\n</p>\n</details>\n<h2>What about the functions?</h2>\n<p>Functions (<strong>function declaration</strong>) hoisting completely.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">testWithDeclaration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Hoisted</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">testWithDeclaration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hoisted\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<details>\n<summary>Show code after compilation</summary>\n<p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">testWithDeclaration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hoisted\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">testWithDeclaration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Hoisted</span></code></pre></div>\n</p>\n</details>\n<br/>\n<p><strong>But</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">testWithExpression</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// TypeError</span>\n\n<span class=\"token keyword\">var</span> <span class=\"token function-variable function\">testWithExpression</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hoisted\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<details>\n<summary>Show code after compilation</summary>\n<p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> testWithExpression<span class=\"token punctuation\">;</span> <span class=\"token comment\">// undefined</span>\n\n<span class=\"token function\">testWithExpression</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// undefined() - TypeError</span>\n\n<span class=\"token keyword\">var</span> <span class=\"token function-variable function\">testWithExpression</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hoisted\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n</p>\n</details>\n<br/>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">testWithArrowFunc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// TypeError</span>\n\n<span class=\"token keyword\">var</span> <span class=\"token function-variable function\">testWithArrowFunc</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Hoisted\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Important</h2>\n<p>Hoisting is performed at the scope level. So variable declarations hoisting\nin their own scope and don’t hoisting in another one. Let’s look at an example.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">var</span> x <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Try to rewrite the code from the example as it will look after compilation.</p>\n<details>\n<summary>Show answer</summary>\n<p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> x<span class=\"token punctuation\">;</span> <span class=\"token comment\">// x hoisted in test function scope</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// undefined</span>\n  x <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">test</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</p>\n</details>\n<h2>let &#x26; const</h2>\n<p>JS also hoisting variables declared via <code class=\"language-text\">let</code> and <code class=\"language-text\">const</code>,\nbut doesn’t initialize them with the <code class=\"language-text\">undefined</code> value, as it happens when using var</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// ReferenceError: Cannot access 'x' before initialization</span>\n\n<span class=\"token keyword\">const</span> x <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span></code></pre></div>","frontmatter":{"title":"Hoisting ⬆️","date":"August 08, 2021","description":"Introductory article about hoisting in js"}},"previous":null,"next":{"fields":{"slug":"/Overload/"},"frontmatter":{"title":"Overloading in JS/TS"}}},"pageContext":{"id":"75bcec5d-b54b-58bc-a887-2d6e8836097d","previousPostId":null,"nextPostId":"6297e518-c90e-5332-b9a3-3c514355d5b1"}},"staticQueryHashes":["230163734","2841359383"]}